/*
 * @Descripttion: 请求数据验证
 * @version:
 * @Author: 麦冬果果
 * @Date: 2021-07-16 15:55:13
 * @LastEditors: 麦冬果果
 * @LastEditTime: 2021-09-11 08:53:52
 */
package middlewares

import (
	"fastapi/src/app/define"
	"fastapi/src/library/mhttp"

	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
	"github.com/gogf/gf/util/gconv"
)

func Parse(r *ghttp.Request) {
	apis := r.GetCtxVar("appApi")
	var appApi *define.AppApi
	gconv.Struct(apis, &appApi)

	req := gconv.MapDeep(r.GetPostMap())
	if req == nil {
		req = g.Map{}
	}

	var whereBys []*WhereBy
	gconv.Structs(appApi.WhereBy, &whereBys)
	//glog.Debug("req>>>>>>>>>>>>>>>>>>>whereBys", whereBys)
	for _, v := range whereBys {

		if !g.IsEmpty(v.Rule) {

			err := g.Validator().Rules(v.Rule).Messages(v.ErrMsg).CheckValue(req[v.Params])
			if err != nil {
				mhttp.Resp.FailJson(true, r, err.String())
			}
		}
	}
	var fieldBys []*FieldBy
	gconv.Structs(appApi.FieldBy, &fieldBys)
	//glog.Debug("req>>>>>>>>>>>>>>>>>>>fieldBys", fieldBys)
	for _, v := range fieldBys {
		if !g.IsEmpty(v.Rule) {
			value := req[v.Fields]
			if !g.IsEmpty(v.FieldAs) {
				value = req[v.FieldAs]
			}
			err := g.Validator().Rules(v.Rule).Messages(v.ErrMsg).CheckValue(value)
			if err != nil {
				mhttp.Resp.FailJson(true, r, err.String())
			}
		}
	}
	r.SetCtxVar("request", req)
	r.Middleware.Next()
}

type WhereBy struct {
	TableName  string `orm:"table_name"  json:"tableName"`  // 查询表名
	Field      string `orm:"field"       json:"field"`      // 查询字段
	Ways       string `orm:"ways"        json:"ways"`       // 查询条件:is,in,...
	Params     string `orm:"params"      json:"params"`     // 查询参数
	ParamsType string `orm:"params_type" json:"paramsType"` // 参数类型
	Rule       string `json:"rule"`                         //验证规则
	ErrMsg     string `json:"errMsg"`                       //错误提示
}

type FieldBy struct {
	FieldTable string `orm:"field_table" json:"fieldTable"` // 表名称
	Fields     string `orm:"fields"     json:"fields"`      // 表字段
	FieldAs    string `orm:"field_as"   json:"fieldAs"`     // 字段别名
	Rule       string `json:"rule"`                         //验证规则
	ErrMsg     string `json:"errMsg"`                       //错误提示
}
